import axios from 'axios';
import router from '../router';
import { ElMessage } from 'element-plus';

const clearAuthInfo = () => {
  if (typeof window === 'undefined') return;
  ['token', 'realname', 'isAdmin', 'userId', 'role', 'username', 'userEmail'].forEach((key) => {
    localStorage.removeItem(key);
  });
  window.dispatchEvent(new CustomEvent('user-info-updated'));
};

// 设置 Axios 默认的基础 URL
const instance = axios.create({
  baseURL: '/api',
  timeout: 5000
});

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = token;
    } else if (config.url !== '/user/login') {
      // 如果没有 token 且不是登录请求，直接跳转登录页
      clearAuthInfo();
      router.push('/login');
      return Promise.reject('未登录');
    }
    // 判断 headers 中是否有 multipart/form-data
    const contentType = config.headers['Content-Type'] || config.headers['content-type'];
    if (contentType && contentType.includes('multipart/form-data')) {
      config.timeout = 5 * 60 * 1000; // 5 分钟
    }

    const data = config.data;
    // 判断 data 是否为普通对象（JSON）
    if (data && typeof data === "object" && !Array.isArray(data)) {
      if (Object.prototype.hasOwnProperty.call(data, "currentPage")) {
        data.page = data.currentPage;
      }
      if (Object.prototype.hasOwnProperty.call(data, "pageSize")) {
        data.rows = data.pageSize;
      }
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    const { data } = response;
    if (data && data.code === 401) {
      clearAuthInfo();
      ElMessage.error('登录已过期，请重新登录');
      router.replace('/login');
      return Promise.reject(data);
    }
    if (data && data.code === 403) {
      if (!response.config || response.config.suppressErrorToast !== true) {
        ElMessage.error(data.msg || '无权限执行该操作');
      }
      return Promise.reject(data);
    }
    if (data && typeof data.code !== 'undefined' && data.code !== 1) {
      if (!response.config || response.config.suppressErrorToast !== true) {
        ElMessage.error(data.msg || '请求失败');
      }
    }
    return response;
  },
  (error) => {
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 清除登录信息
          clearAuthInfo();
          ElMessage.error('登录已过期，请重新登录');
          router.replace('/login');
          break;
        case 403:
          if (!error.config || error.config.suppressErrorToast !== true) {
            ElMessage.error(error.response.data?.msg || error.response.data?.message || '无权限执行该操作');
          }
          break;
        default:
          if (!error.config || error.config.suppressErrorToast !== true) {
            ElMessage.error(error.response.data?.msg || error.response.data?.message || '请求失败');
          }
      }
    }
    else {
      ElMessage.error('网络异常，请稍后重试');
    }
    return Promise.reject(error);
  }
);

export default instance;
